import { Effect, ImmerReducer, history } from 'umi'
import { login } from '@/services/admin'
import { message } from 'antd'
import { setItem, getItem } from '@/utils/cookie'
export interface ILoginState {
  adminname: string
  token: string
  role: string
}

export interface ILoginModelInterface {
  namespace: 'admin' // 接口中的namespace 直接写模块的名称即可
  state: ILoginState,
  effects: {
    loginReq: Effect
  },
  reducers: {
    changeAdminName: ImmerReducer<ILoginState>,
    changeToken: ImmerReducer<ILoginState>,
    changeRole: ImmerReducer<ILoginState>
  }
}

const LoginModel: ILoginModelInterface = {
  namespace: 'admin', // 命名空间 --- 区分模块
  state: { // 初始化的状态 --- 从本地存储提取，防止页面刷新状态丢失
    adminname: getItem('adminname') || '',
    token: getItem('token') || '',
    role: getItem('role') || '1'
  },
  effects: { // 可以看作是 vuex中actions, 必须写成 generator 的写法
    // payload 解构赋值 说明传入过来的参数是以对象形式传递的
    // call 代表调用 异步操作的方法
    // put 代表 类似于之前的 dispatch
    *loginReq ({ payload }: any, { call, put }: any) {
      console.log(11111)
      // 异步操作数据
      const res = yield call(login, payload)
      console.log(res)
      if (res.data.code === '10003') {
        message.error('密码错误')
      } else if (res.data.code === '10005') {
        message.error('没有此账号，与管理员联系')
      } else {
        // 修改状态
        yield put({ type: 'changeAdminName', payload: res.data.data.adminname })
        yield put({ type: 'changeToken', payload: res.data.data.token })
        yield put({ type: 'changeRole', payload: res.data.data.role })
        // 保存数据到本地
        setItem('adminname', res.data.data.adminname, 7)
        setItem('token', res.data.data.token, 7)
        setItem('role', res.data.data.role, 7)

        // 跳转到系统首页
        history.push('/home')
      }
    }
  },
  reducers: { // 类似于vuex中的 mutations
    changeAdminName (state: ILoginState, action: any) {
      state.adminname = action.payload
    },
    changeToken (state: ILoginState, action: any) {
      state.token = action.payload
    },
    changeRole (state: ILoginState, action: any) {
      state.role = action.payload
    }
  }
}

export default LoginModel
